# coding=utf-8
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import viewsets
from django.db.models import Q
from rest_framework.decorators import action
from MSB_ERP.utils.pagination import GlobalPagination
from MSB_ERP.utils.base_views import MultipleOpenMixin, MultipleDestoryMixin
from goods_info.models import GoodsCategoryModel
from goods_info.serializer.category_serializer import GoodsCategorySerializer


class CategoryView(viewsets.ModelViewSet, MultipleDestoryMixin):
    """
    create:
    货品（商品）类别信息--新增

    货品（商品）类别信息新增, status: 201(成功), return: 新增货品（商品）类别信息信息

    destroy:
    货品（商品）类别信息--删除

    货品（商品）类别信息删除, status: 204(成功), return: None

    multiple_delete:
    货品（商品）类别信息--批量删除,必传json参数：ids=[1,2,3,4...]

    货品（商品）类别信息批量删除, status: 204(成功), return: None

    multiple_open:
    货品（商品）类别信息--批量启用或者禁用,必传(json)参数：ids=[1,2,3,4...](列表中可以只有一个)，is_open=1/0

    {
        "ids":[1,2],
        "is_open":"0"
    }
    is_open=1表示禁用，is_open=0表示启用，
    货品（商品）类别信息批量启用或者禁用, status: 204(成功), return: None

    update:
    货品（商品）类别信息--修改,一般用于修改多个属性

    货品（商品）类别信息修改, status: 200(成功), return: 修改后的货品（商品）类别信息信息

    partial_update:
    货品（商品）类别信息--局部修改(一般修改一个属性),可以传参任意属性的值，服务器会修改指定的属性值

    货品（商品）类别信息局部修改, status: 200(成功), return: 修改后的货品（商品）类别信息信息

    list: 查询所有的顶级类别
    货品（商品）类别信息--获取分页列表，pid=0，可选get请求参数：pid，如果没有传的话，则查询顶级类别，否则就查该id的类别

    货品（商品）类别信息列表信息, status: 200(成功), return: 货品（商品）类别信息信息列表

    retrieve:
    查询某一个货品（商品）类别信息

    查询指定ID的货品（商品）类别信息, status: 200(成功), return: 用户货品（商品）类别信息
    """

    queryset = GoodsCategoryModel.objects.all()
    serializer_class = GoodsCategorySerializer
    # pagination_class = GlobalPagination

    def get_queryset(self):
        if self.action == 'list':  # 判断是否查询顶级类别还是某一个子类别
            # 获得请求参数（在get中）：pid
            pid = self.request.query_params.get('pid',None)
            if pid and pid != "0":
                return GoodsCategoryModel.objects.filter(parent__id=int(pid)).all()
            else:
                # 过滤查询parent__isnull没有父类别就是顶级类别
                return GoodsCategoryModel.objects.filter(parent__isnull=True).all()
        else:
            return GoodsCategoryModel.objects.all()

    pid_param = openapi.Parameter(name='pid',in_=openapi.IN_QUERY,description='父类别的ID，可以不传，查询所有顶级类别',type=openapi.TYPE_INTEGER)
    @swagger_auto_schema(manual_parameters=[pid_param],operation_description='商品类别的列表',)
    def list(self,request,*args,**kwargs):
        return super(CategoryView, self).list(request=request,*args,**kwargs)
    